//: C21:SpecialList.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 1999
// Copyright notice in Copyright.txt
// Using the second version of transform()
#include "Inventory.h"
#include "PrintSequence.h"
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>
using namespace std;

struct Discounter {
    Inventory operator()(const Inventory& inv,
                         float discount) {
        return Inventory(inv.getItem(),
                         inv.getQuantity(),
                         inv.getValue() * (1 - discount));
    }
};

struct DiscGen {
    DiscGen() {
        srand(time(0));
    }
    float operator()() {
        float r = float(rand() % 10);
        return r / 100.0;
    }
};

int main()
{
    vector<Inventory> vi;
    generate_n(back_inserter(vi), 15, InvenGen());
    print(vi, "vi");
    vector<float> disc;
    generate_n(back_inserter(disc), 15, DiscGen());
    print(disc, "Discounts:");
    vector<Inventory> discounted;
    transform(vi.begin(),vi.end(), disc.begin(),
              back_inserter(discounted), Discounter());
    print(discounted, "discounted");
} ///:~
